package com.ruoyi.shuati.service.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.shuati.domain.dto.UserLoginAndRegisterDto;
import com.ruoyi.shuati.util.HttpClientUtil;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.ruoyi.shuati.mapper.ShuatiUserMapper;
import com.ruoyi.shuati.domain.ShuatiUser;
import com.ruoyi.shuati.service.IShuatiUserService;

/**
 * 【请填写功能名称】Service业务层处理
 *
 * @author ruoyi
 * @date 2024-06-03
 */
@Service
public class ShuatiUserServiceImpl implements IShuatiUserService {

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    //微信获取openidurl
    private static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";

    @Value("${weixin.appId}")
    private String appId;

    @Value("${weixin.appSecret}")
    private String appSecret;

    @Autowired
    private ShuatiUserMapper shuatiUserMapper;


    //这个就是我们封装好的service
    @Autowired
    private WxMpService wxMpService;

    /**
     * 查询【请填写功能名称】
     *
     * @param id 【请填写功能名称】主键
     * @return 【请填写功能名称】
     */
    @Override
    public ShuatiUser selectShuatiUserById(String id) {
        return shuatiUserMapper.selectShuatiUserById(id);
    }

    /**
     * 查询【请填写功能名称】列表
     *
     * @param shuatiUser 【请填写功能名称】
     * @return 【请填写功能名称】
     */
    @Override
    public List<ShuatiUser> selectShuatiUserList(ShuatiUser shuatiUser) {
        return shuatiUserMapper.selectShuatiUserList(shuatiUser);
    }

    /**
     * 新增【请填写功能名称】
     *
     * @param shuatiUser 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int insertShuatiUser(ShuatiUser shuatiUser) {
        shuatiUser.setCreateTime(DateUtils.getNowDate());
        return shuatiUserMapper.insertShuatiUser(shuatiUser);
    }

    /**
     * 修改【请填写功能名称】
     *
     * @param shuatiUser 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int updateShuatiUser(ShuatiUser shuatiUser) {
        shuatiUser.setUpdateTime(DateUtils.getNowDate());
        return shuatiUserMapper.updateShuatiUser(shuatiUser);
    }

    /**
     * 批量删除【请填写功能名称】
     *
     * @param ids 需要删除的【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteShuatiUserByIds(String[] ids) {
        return shuatiUserMapper.deleteShuatiUserByIds(ids);
    }

    /**
     * 删除【请填写功能名称】信息
     *
     * @param id 【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteShuatiUserById(String id) {
        return shuatiUserMapper.deleteShuatiUserById(id);
    }


    /**
     * 用户注册或者登录
     *
     * @param userLoginAndRegisterDto 【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public Map loginAndRegis(UserLoginAndRegisterDto userLoginAndRegisterDto) {
        logger.info(userLoginAndRegisterDto + "入参");
        //1.调用微信接口由code拿到openid
        Map<String, Object> resultMap = new HashMap<>();
        if (StringUtils.isEmpty(userLoginAndRegisterDto.getCode())) {
            resultMap.put("code", 500);
            resultMap.put("msg", "请求参数为空");
            return resultMap;
        }

        // 调用微信接口，获取当前微信用户的openid
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("appid", appId);
        paramMap.put("secret", appSecret);
        paramMap.put("js_code", userLoginAndRegisterDto.getCode());
        paramMap.put("grant_type", "authorization_code");
        String respond = HttpClientUtil.doGet(WX_LOGIN, paramMap);
        // 调用微信接口后返回的参数是Json格式的，使用JSON解析。
        JSONObject jsonObject = JSON.parseObject(respond);
        logger.info("微信接口返回的参数是：" + jsonObject);
        String openid = jsonObject.getString("openid");
        logger.info("当前用户openid:" + openid);


        if (StringUtils.isEmpty(openid)) {
            resultMap.put("code", 500);
            resultMap.put("msg", "请求微信登录接口异常");
            return resultMap;
        }

        //2.调用mapper方法看当前用户是否存在
        ShuatiUser selectShuatiUser = shuatiUserMapper.selectShuatiUserById(openid);
        if (selectShuatiUser == null) {
            //不存在即新增用户
            ShuatiUser shuatiUser = new ShuatiUser();
            shuatiUser.setId(openid);
            shuatiUser.setCreateTime(new Date());
            shuatiUser.setUpdateTime(new Date());
            shuatiUserMapper.insertShuatiUser(shuatiUser);

            // 第1步，先登录上
            StpUtil.login(openid);
            // 第2步，获取 Token  相关参数
            SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
            // 第3步，返回给前端
            return SaResult.data(tokenInfo);
        }else{
            // 第1步，先登录上
            StpUtil.login(selectShuatiUser.getId());
            // 第2步，获取 Token  相关参数
            SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
            // 第3步，返回给前端
            return SaResult.data(tokenInfo);
        }

        //4.最后返回登录的token
    }


}
